Docker Desktop for Apple siliconでRedashを動作させてみた
Docker Desktop for Apple siliconにてIntel環境で動かしていたイメージを起動させようとすると正常に動作しないことがあります。Rosetta2にてカバー不可能なamd64ビルドのライブラリがあるかもしれません。
Redashが動作しない状態に陥り、依存状態を辿ってみた結果M1版がリリースされていないライブラリが原因だと分かりました。とりあえず動くようにしてみました。
watchmedoのコメントアウト
worker及びschedulerを起動した際のメッセージにて、インストールされないことが発覚。
Starting dev RQ orker... /app/bin/docker-entrypoint: line 28: exec: watchmedo: not found
該当行を見てみます。
% sed -n 28p bin/docker-entrypoint exec watchmedo auto-restart --directory=./redash/ --pattern=*.py --recursive -- ./manage.py rq worker $QUEUES
We've spent a lot of time working on this and the problem is that emulation on M1 does not support inotify .
対処が悩ましいところですが、redash本体に直修正はほぼ入れないためwatchmedoを外す方向で進めます。
dev_worker() { echo "Starting dev RQ worker..." export WORKERS_COUNT=${WORKERS_COUNT:-2} export QUEUES=${QUEUES:-} exec supervisord -c worker.conf # exec watchmedo auto-restart --directory=./redash/ --pattern=*.py --recursive -- ./manage.py rq worker $QUEUES }
worker()
側の処理をそのまま持ってくることで対処しました。schedulerについても同様の対処をいれておきます。
dev_scheduler() { echo "Starting dev RQ scheduler..." exec /app/manage.py rq scheduler #exec watchmedo auto-restart --directory=./redash/ --pattern=*.py --recursive -- ./manage.py rq scheduler }
client/distのビルド
これはM1そのものは直接関係しないかもしれません。
cloneしたあとにdocker-composeを走らせた結果、client/dist
が存在していないためにエラーとなるケースの対処です。
git clone [email protected]:getredash/redash.git cd redash/ # edit source npm run build docker-compose run --rm server create_db docker-compose up -d
docker-entrypointへの修正は # edit source
にて行ってください。
/bin/sh: tsc: command not found
となる場合は
npm install typescript -g
Cannot find type definition file for 'jest'
となる場合は
yarn add --dev jest
とそれぞれ実行します。
あとがき
watchmedoについてはイメージに --platform=linux/amd64
と指定を入れる事も考えましたが、エラーメッセージが
OSError: [Errno 38] Function not implemented
に変わるだけだったので諦めました。
利用するイメージを linux/arm64
から linux/amd64
に切り替えることで動作することもあれば対処不能な場合もあります。リポジトリのIssueにて対応が進んでいる可能性もあるので、困った場合はライブラリ公式リポジトリのIssueを確認してみましょう。